りおんクロニクル


C# × 画像処理(サムネイル生成・圧縮)|高速・高品質な実務ガイド【2026年版】

Home【2026年版】C# / .NET入門と実践ガイド|基礎・業務アプリ開発・SQLite連携まで体系的に解説

C#で画像処理を行う場合、 サムネイル生成・圧縮・リサイズ・フォーマット変換 は業務アプリでもよく使われます。 この記事では、ImageSharp / SkiaSharp / System.Drawing の3つを比較しつつ、 実務で使えるコードをまとめます。

この記事でわかること
・画像処理ライブラリの比較(ImageSharp / SkiaSharp / System.Drawing)
・サムネイル生成(リサイズ)
・JPEG圧縮(品質調整)
・フォーマット変換(PNG → JPEG など)
・大量画像の高速処理
・非同期処理とメモリ対策
・業務アプリ向けベストプラクティス

1. C#で使える画像処理ライブラリ比較

項目ImageSharpSkiaSharpSystem.Drawing
特徴高品質・クロスプラットフォーム高速・軽量古い・非推奨(Linux不可)
速度◎(最速)
商用利用有償ライセンス必要無料無料
推奨度◎(品質重視)◎(速度重視)×(新規利用非推奨)

品質重視 → ImageSharp 速度重視 → SkiaSharp System.Drawing → 新規では使わない

2. ImageSharpでサムネイル生成(高品質)

■ 2-1. 基本のリサイズ(サムネイル生成)

using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;

using var image = Image.Load("input.jpg");

image.Mutate(x => x.Resize(new ResizeOptions
{
    Mode = ResizeMode.Max,
    Size = new Size(300, 300)
}));

image.Save("thumb.jpg");

縦横比を維持したまま、最大300pxに収まるサムネイルを生成します。

■ 2-2. JPEG圧縮(品質調整)

image.Save("compressed.jpg", new JpegEncoder
{
    Quality = 70 // 0〜100
});

品質70は「見た目ほぼ同じ・ファイルサイズ半分」が目安です。

3. SkiaSharpで高速サムネイル生成(最速)

■ 3-1. リサイズ

using SkiaSharp;

using var input = File.OpenRead("input.jpg");
using var bitmap = SKBitmap.Decode(input);

var resized = bitmap.Resize(new SKImageInfo(300, 300), SKFilterQuality.Medium);

using var image = SKImage.FromBitmap(resized);
using var data = image.Encode(SKEncodedImageFormat.Jpeg, 80);

File.WriteAllBytes("thumb.jpg", data.ToArray());

SkiaSharpはとにかく速いので、大量画像処理に向いています。

4. System.Drawing(非推奨だが既存資産向け)

System.Drawing は .NET 6 以降で非推奨(Linux非対応)。 新規開発では ImageSharp / SkiaSharp を使うべきです。

■ 4-1. リサイズ

using var src = Image.FromFile("input.jpg");
using var dst = new Bitmap(300, 300);

using var g = Graphics.FromImage(dst);
g.DrawImage(src, 0, 0, 300, 300);

dst.Save("thumb.jpg", ImageFormat.Jpeg);

5. フォーマット変換(PNG → JPEG)

■ ImageSharp

using var image = Image.Load("input.png");
image.Save("output.jpg", new JpegEncoder { Quality = 80 });

■ SkiaSharp

using var bitmap = SKBitmap.Decode("input.png");
using var image = SKImage.FromBitmap(bitmap);
using var data = image.Encode(SKEncodedImageFormat.Jpeg, 80);
File.WriteAllBytes("output.jpg", data.ToArray());

6. 大量画像の高速処理(1000枚〜1万枚)

大量画像を処理する場合は、 並列処理(Parallel.ForEach)+ SkiaSharp が最速です。

■ 6-1. 並列サムネイル生成

var files = Directory.GetFiles("images", "*.jpg");

Parallel.ForEach(files, file =>
{
    using var bitmap = SKBitmap.Decode(file);
    var resized = bitmap.Resize(new SKImageInfo(300, 300), SKFilterQuality.Medium);

    using var image = SKImage.FromBitmap(resized);
    using var data = image.Encode(SKEncodedImageFormat.Jpeg, 80);

    var outPath = Path.Combine("thumbs", Path.GetFileName(file));
    File.WriteAllBytes(outPath, data.ToArray());
});

CPUコア数をフル活用して高速化できます。

7. 非同期処理(UIフリーズ防止)

WPF / WinUI などのUIアプリでは、 画像処理は必ずバックグラウンドで実行します。

■ 7-1. 非同期で画像処理

public async Task CreateThumbnailAsync(string input, string output)
{
    await Task.Run(() =>
    {
        using var image = Image.Load(input);
        image.Mutate(x => x.Resize(300, 300));
        image.Save(output);
    });
}

UIスレッドをブロックしないため、アプリが固まらなくなります。

8. メモリ対策(OutOfMemory防止)

9. 業務アプリ向けベストプラクティス

まとめ:C#の画像処理は“ImageSharp × SkiaSharp”で完結する

「画像が重い」「サムネイルを自動生成したい」 という現場のニーズに対して、 C#の画像処理は非常に強力な解決策になります。 この記事をベースに、あなたのアプリに最適な画像処理フローを設計してみてください。

前のページ  次のページ